# 金额转换工具

def calculate_commission_and_remaining(balance, unit="20"):
    """
    计算余额的抽成金额与扣除抽成后的剩余金额
    
    参数:
        balance: 可转为数字的类型（int/float/数字字符串），原始余额（单位：元）
        unit: 可转为数字的类型（int/float/数字字符串/带%的字符串），抽成比例
              - 支持格式：20（默认，表20%）、"20"（表20%）、"20%"（表20%）
              - 若输入超过100（如200）或"200%"，会自动限制为100%（避免抽成超过本金）
              - 不支持负数（负数会触发错误）
    
    返回:
        tuple | None: 
            - 成功：(抽成金额, 剩余金额)，均为保留2位小数的float（如(6.0, 24.0)）
            - 失败：返回None（输入不合法或转换错误）
    
    示例:
        >>> calculate_commission_and_remaining(30, "20%")  # 30元抽20%
        (6.0, 24.0)
        >>> calculate_commission_and_remaining(100.5, 15)  # 100.5元抽15%
        (15.08, 85.42)
        >>> calculate_commission_and_remaining("50.8", "30")  # 字符串余额+字符串抽成比
        (15.24, 35.56)
        >>> calculate_commission_and_remaining(80, "120%")  # 抽成比超100%，按100%算
        (80.0, 0.0)
        >>> calculate_commission_and_remaining("abc", 20)  # 无效余额，返回None
        转换错误: could not convert string to float: 'abc'
        None
    """
    try:
        # 1. 安全转换原始余额（支持数字/数字字符串）
        balance_value = float(balance)
        # 校验余额合法性（不能为负数）
        if balance_value < 0:
            print(f"转换错误: 原始余额不能为负数（当前输入：{balance_value}）")
            return None

        # 2. 处理抽成比例unit，统一转为「百分比系数」（如20% → 0.2）
        if isinstance(unit, str):
            if "%" in unit:
                # 处理带%的字符串（如"20%" → 20 → 0.2）
                unit_num = float(unit.replace("%", ""))
            else:
                # 处理纯数字字符串（如"20" → 20 → 0.2）
                unit_num = float(unit)
        else:
            # 处理数字类型unit（如20 → 0.2）
            unit_num = float(unit)

        # 校验抽成比例合法性（不能为负，且超过100%按100%算）
        if unit_num < 0:
            print(f"转换错误: 抽成比例不能为负数（当前输入：{unit}）")
            return None
        # 限制抽成比最大为100%（避免抽成超过本金）
        unit_ratio = min(unit_num / 100, 1.0)

        # 3. 计算抽成金额和剩余金额（保留2位小数，符合货币精度）
        commission = round(balance_value * unit_ratio, 2)
        remaining = round(balance_value - commission, 2)

        # 4. 返回结果（抽成金额, 剩余金额）
        return (commission, remaining)

    # 捕获所有转换/类型错误（如非数字输入、格式错误）
    except (ValueError, TypeError) as e:
        print(f"转换错误: {e}")
        return None


# 保证金转换
def calculate_average_list(number, margin_rate=4.5):
    """计算数字的4.5倍后，返回两个平均分配且最多保留两位小数的结果列表"""
    try:
        # 先将输入安全转换为数字（支持字符串数字）
        num = float(number)
        total = num * margin_rate
        average = total / 2
        
        # 处理小数位数：最多保留两位，整数则转为int
        def format_number(n):
            # 若为整数（如5.0），返回int类型
            if n.is_integer():
                return int(n)
            # 否则保留两位小数
            return round(n, 2)
        
        return [format_number(average), format_number(average)]
    
    except (ValueError, TypeError):
        # 处理无效输入（如非数字），返回空列表或提示
        return []




# 订单完成后的利润计算
def safe_subtract(param1, param2):
    """
    安全计算两个参数的差值（param1 - param2）
    支持数字、字符串数字等类型的输入，转换失败时返回None
    
    参数:
        param1: 第一个参数（可转为数字的类型）
        param2: 第二个参数（可转为数字的类型）
    
    返回:
        计算结果（float或int），转换失败则返回None
    """
    try:
        # 尝试将参数转换为浮点数（支持整数和小数）
        num1 = float(param1)
        num2 = float(param2)
        # 计算差值并返回（如果是整数结果，转为int更直观）
        result = num1 - num2
        return int(result) if result.is_integer() else result
    except (ValueError, TypeError):
        # 处理转换失败的情况（如非数字字符串、None等）
        return None



# 两数相加
def safe_add(param1, param2):
    """
    安全计算两个参数的和（param1 + param2）
    支持数字、字符串数字等类型输入，转换失败返回None
    
    参数:
        param1: 第一个参数（可转为数字的类型）
        param2: 第二个参数（可转为数字的类型）
    
    返回:
        计算结果（int或float），转换失败则返回None
    """
    try:
        # 尝试转换为浮点数，兼容整数和小数形式
        num1 = float(param1)
        num2 = float(param2)
        # 计算和，若结果为整数则转为int更直观
        result = num1 + num2
        return int(result) if result.is_integer() else result
    except (ValueError, TypeError):
        # 处理无法转换为数字的情况（如非数字字符串、None等）
        return None